package com.snapan.es.entity;

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.*;

import java.util.Date;

/**
 * ES 索引实体：对应user_file 索引（关联 user_file + file_base 分表）
 */
@Document(indexName = "snapan_user_file", createIndex = true)
// 通过 @Setting 定义自定义分词器（解决中文后缀、特殊符号拆分问题）
@Setting(settingPath = "elasticsearch-settings.json")
public class UserFileDocument {
    @Id // 与 user_file.id 一致，唯一标识
    private Long id;

    @Field(type = FieldType.Long) // 对应 user_file.user_id（用户隔离）
    private Long userId;

    @Field(type = FieldType.Long) // 对应 user_file.file_base_id（关联 file_base）
    private Long fileBaseId;

    // 子字段名：fileName.en
    // 子字段：英文分词（拆分单词和字母）
    // 对应 user_file.file_name（用户自定义文件名搜索）
    // 文件名：中文主字段（IK 分词） + 英文子字段（standard 分词）
    @MultiField(
            mainField = @Field(
                    type = FieldType.Text,
                    analyzer = "fileName_light_analyzer", // 新增的轻量分词器（索引时）
                    searchAnalyzer = "fileName_light_search_analyzer", // 新增的轻量搜索分词器
                    norms = false
            ),
            otherFields = {
                    @InnerField(
                            suffix = "en",
                            type = FieldType.Text,
                            analyzer = "standard",
                            searchAnalyzer = "standard",
                            norms = false
                    )
            }
    )
    private String fileName;

    @Field(type = FieldType.Long) // 对应 user_file.parent_id（筛选目录下文件）
    private Long parentId;

    @Field(type = FieldType.Boolean) // 对应 user_file.is_directory（0-文件，1-目录）
    private Boolean isDirectory;

    @Field(type = FieldType.Boolean) // 对应 user_file.status（0-不是，1-是）
    private Boolean isRecycled;

    // 对应 file_base.real_name（文件真实名搜索）
    // 真实名：中文主字段（IK 分词） + 英文子字段（standard 分词）
    @MultiField(
            mainField = @Field(
                    type = FieldType.Text,
                    analyzer = "ik_max_word",
                    searchAnalyzer = "ik_smart"
            ),
            otherFields = {
                    @InnerField(
                            suffix = "en", // 子字段名：realName.en
                            type = FieldType.Text,
                            analyzer = "standard"
                    )
            }
    )
    private String realName;

    @Field(type = FieldType.Long) // 对应 file_base.file_size（大小筛选）
    private Long fileSize;


    @Field(type = FieldType.Keyword) // 对应 file_base.suffix（后缀筛选，如 .txt）
    private String fileSuffix;

    @Field(type = FieldType.Keyword) // 对应 file_base.file_path（提取内容用）
    private String filePath;

    // 服务器文件内容（全文搜索）
    @MultiField(
            mainField = @Field(
                    type = FieldType.Text,
                    analyzer = "ik_max_word",
                    searchAnalyzer = "ik_smart"
            ),
            otherFields = {
                    @InnerField(
                            suffix = "en", // 子字段名：fileContent.en
                            type = FieldType.Text,
                            analyzer = "standard"
                    )
            }
    )
    private String fileContent;

    @Field(type = FieldType.Date, pattern = "yyyy-MM-dd HH:mm:ss") // 对应 user_file.update_time（用户关联时间筛选）
    private Date userFileUpdateTime;

    @Field(type = FieldType.Date, pattern = "yyyy-MM-dd HH:mm:ss") // 对应 user_file.delete_time（用户关联时间筛选）
    private Date userFileDeleteTime;


    @Field(type = FieldType.Date, pattern = "yyyy-MM-dd HH:mm:ss") // 对应 user_file.expire_time（用户关联时间筛选）
    private Date userFileExpireTime;

    @Field(type = FieldType.Date, pattern = "yyyy-MM-dd HH:mm:ss") // 对应 file_base.update_time（文件基础创建时间筛选）
    private Date fileBaseUpdateTime;


    public Boolean getRecycled() {
        return isRecycled;
    }

    public void setRecycled(Boolean recycled) {
        isRecycled = recycled;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getUserId() {
        return userId;
    }

    public void setUserId(Long userId) {
        this.userId = userId;
    }

    public Long getFileBaseId() {
        return fileBaseId;
    }

    public void setFileBaseId(Long fileBaseId) {
        this.fileBaseId = fileBaseId;
    }

    public String getFileName() {
        return fileName;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }

    public Date getUserFileDeleteTime() {
        return userFileDeleteTime;
    }

    public void setUserFileDeleteTime(Date userFileDeleteTime) {
        this.userFileDeleteTime = userFileDeleteTime;
    }

    public Date getUserFileExpireTime() {
        return userFileExpireTime;
    }

    public void setUserFileExpireTime(Date userFileExpireTime) {
        this.userFileExpireTime = userFileExpireTime;
    }

    public void setParentId(Long parentId) {
        this.parentId = parentId;
    }


    public Boolean getDirectory() {
        return isDirectory;
    }

    public void setDirectory(Boolean directory) {
        isDirectory = directory;
    }

    public String getRealName() {
        return realName;
    }

    public void setRealName(String realName) {
        this.realName = realName;
    }

    public Long getFileSize() {
        return fileSize;
    }

    public void setFileSize(Long fileSize) {
        this.fileSize = fileSize;
    }


    public String getFileSuffix() {
        return fileSuffix;
    }

    public void setFileSuffix(String fileSuffix) {
        this.fileSuffix = fileSuffix;
    }



    public void setFilePath(String filePath) {
        this.filePath = filePath;
    }

    public String getFileContent() {
        return fileContent;
    }

    public void setFileContent(String fileContent) {
        this.fileContent = fileContent;
    }



    public Long getParentId() {
        return parentId;
    }



    public String getFilePath() {
        return filePath;
    }

    public Date getUserFileUpdateTime() {
        return userFileUpdateTime;
    }

    public void setUserFileUpdateTime(Date userFileUpdateTime) {
        this.userFileUpdateTime = userFileUpdateTime;
    }

    public Date getFileBaseUpdateTime() {
        return fileBaseUpdateTime;
    }

    public void setFileBaseUpdateTime(Date fileBaseUpdateTime) {
        this.fileBaseUpdateTime = fileBaseUpdateTime;
    }
}
